package gr1381.mihailproject;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
        
/**
 * @author Mihail Silivonchik, group1381
 * @since 1.01
 * Объект класса <code>Node<\code> имитирут узел графа.
 * 
 * @param name имя вершины (её номер: 1,2...)
 * @param amount statick-переменная для хранения числа узлов
 * @param timein время входа в узел
 * @param low самая верхняя вершина, в которую можно
 *        попасть из поддерева данного узла с помощью обратного ребра
 * @param used показатель пройденности вершины [false - непосещённая вершина, true - ...]
 * @param adjacentlist список смежности узла
 */
public class Node 
{
    public Node () 
    {
        amount++;
        name = amount;
        timein = 0;
        low = 0;
        used = false;
        adjacentlist = new HashMap <Integer, Node> ();
    }
    
    public int getName () { return this.name; }
    
    /**Метод устанавливает время входа в узел*/
    public void setTimeIn (int t) { this.timein = t; }
    /** @return время входа в узел */
    public int getTimeIn () { return this.timein; }
    
    /**Метод устанавливает "минимальное время входа"*/
    public void setLow (int l) { this.low = l; }
    /** @return "минимальное время входа"*/
    public int getLow () { return this.low; }
    
    /**Метод устанавливает текущий узел как непройденный*/
    public void setUsedFalse () { this.used = false; }
    /**Метод устанавливает текущий узел как пройденный*/
    public void setUsedTrue () { this.used = true; }
    /** @return текущее значение показателя пройденности вершины */
    public boolean getUsed () { return this.used; }
    
    /**Метод добавляет новую смежную вершину к списку */
    public void addToAdjacntList (int adjacentnode, Node element) { this.adjacentlist.put(adjacentnode, element); }
    /** @return получает элемент списка смежности по ключу */
    public Node getAdjacentElement (int key) { return this.adjacentlist.get(key); }
    /** @return количество смежных узлов для заданного узла */
    public int getSizeAdjacentList () { return this.adjacentlist.size(); }
    /** Метод выводит список смежности*/
    public void showAdjacentList ()
    {
        System.out.println("Количество смежных вершин: " + adjacentlist.size());
        //получаем набор элементов, содержащий все значения карты
        Set < Map.Entry <Integer, Node> > set = adjacentlist.entrySet();
        
        for (Map.Entry <Integer, Node> element : set)
        {
            System.out.print ("Смежная вершина: " + element.getKey() + " [bykey]");
            System.out.println (" Проверка связи: " + element.getValue().getName() + " [byname]");
        }
    }
    
    
    private static int amount = -1;
    private int name;
    private int timein;
    private int low;
    private boolean used;
    private HashMap <Integer, Node> adjacentlist;
}
